// nest - 鸟巢 - 理解： 折叠的意思


/* 
 函数的功能是：折叠tokens，将#和/之间的tokens整合起来，作为下表（索引）为2的项（实际是数组的第三项）。    -- 理解： 就是将数组不能用一维数组，而是判断碰到#的时候，将内容收集起来放到一个数组里。 碰到/的时候弹出数组。
*/
export default function nestTokens(tokens){ // 收集一个零散的tokens数组
    var nestTokens = []; // 最终折叠后的值
    let sections = []; // 每次进栈出栈的值
    var collector = nestTokens; // 收集每次需要收集的值，比如碰到一个#，就将其数组范围内的值收集起来。
    
     for(let i = 0; i < tokens.length; i++){ 
        let token = tokens[i];
        switch(token[0]){
            case '#':
                collector.push(token); // 将#的值压入收集器中 -- 如果是首次，因为引用值，所以最终折叠值也有了
                sections.push(token); // 将#的值压入栈中

                // 比如是第一次，那么就在这个时候重置为第一层的第一个token的， 第二个索引位置。
                collector = token[2] = []; // 因为碰到了#，就要重置收集器。 （因为到了新的#，就要收集新的值了） -- 这里的token[2]是一个数组，表示#和/之间的内容
                break;
            case '/':
                sections.pop(); // 弹出栈顶的值
                collector = sections.length > 0 ? sections[sections.length - 1][2] : nestTokens; // 如果栈有值，说明还有父级。  就把收集器指向父级的收集器。 而如果没有父级节点，说明到外层了，就直接指向最外层。
                break;
            default:
                collector.push(token); // 将其他的值直接压入收集器中
                break;
        }
            

    }

    return nestTokens;
}